package cn.lzy.demo;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Description
 * @Author lzy
 * @Date 2023/12/14 17:33
 * @Version
 *
 * CGLIB 的原理：
 * public class CalculatorProxy extends Calculator{
 *     int add(int a,int b){
 *         //xxxx
 *         super.add(a,b);
 *         //xxx
 *     }
 * }
 **/
public class CalculatorProxy implements MethodInterceptor {

    /**
     * 这个就是拦截器，将来 cn.lzy.demo.Calculator#add(int, int) 方法执行的时候，这个拦截器会被触发，额外的工作就可以在这个方法中完成
     * @param o         代理对象
     * @param method    被代理的方法
     * @param objects   方法的参数
     * @param methodProxy   代理方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        long startTime = System.currentTimeMillis();
        // invokeSuper ———— 相当于调用父类的方法，因为 CGLIB 动态代理，相当于给当前类生成了一个子类，在子类中添加了额外的逻辑
        Object result = methodProxy.invokeSuper(o, objects);
        long endTime = System.currentTimeMillis();
        System.out.println(method.getName() + "方法执行耗时：" + (endTime - startTime) + "毫秒");
        return result;
    }
}
